Глава
12
Построение
форм
В предыдущих
главах мы уже неоднократно использовали HTML-тег <FORM> позволяющий создавать
формы для обработки данных. Впрочем, в ColdFusion существует тег <CFFORM>,
предназначенный для той же цели, но при этом включающий в себя помимо текстовых
полей ввода, флажков, переключателей (или радиокнопок) и списков, такие элементы,
как дерево (tree), движок (slider), сетку данных (grid), а также предоставляющий
возможность дополнять форму собственными Java-апплетами.
Помимо дополнительных
элементов, позволяющих с легкостью обогатить собственные формы, применение тега
<CFFORM> в сочетании с тегами ввода помогает контролировать поля ввода
с помощью встроенного атрибута VALIDATE, тем самым облегчая написание кода.
В то же время вы можете использовать HTML-тег <FORM> в комбинации с тегом
<CFFORM>, используя атрибут PASSTHROUGH, но обо всем по порядку.
Тег формы
<CFFORM> имеет следующие базовые управляющие элементы:
Тег формы
<CFFORM> может содержать управляющие элементы, основанные на Java-апплетах:
Синтаксис:
<CFFORM NAME
= "name"
ACTION = "form_action"
PRESERVEDATA
= "Yes I No"
ENABLECAB =
"Yes | NO"
ONSUBMIT = "javascript"
TARGET = "window__name"
ENCTYPE = "type"
PASSTHROUGH
= "HTML_attributes"
CODEBASE = "URL"
ARCHIVE = "URL">
Элементы формы </CFFORM>
В табл. 12.1
представлено описание атрибутов тега <CFFORM>.
Таблица
12.1. Описание атрибутов тега <CFFORM>
Атрибут |
Описание |
||
NAME ACTION PRESERVEDATA
ENABLECAB |
Наименование
формы. Необязательный атрибут Имя ColdFusion-страницы,
которая будет обрабатывать переменные формы. Обязательный атрибут Определяет,
отражать ли данные, которые были введены в форме, образованной тегом
<CFFORM>, на странице, указанной атрибутом ACTION. Этот атрибут
предназначен для управляющих элементов <CFSLIDER> И <CFTEXTINPUT>.
ДЛЯ управляющего элемента <CFTREE> позволяет раскрывать предварительно
выбранные ПУНКТЫ. ДЛЯ <CFTREE> атрибут COMPLETEPATH ДОЛЖ6Н быть
равен Yes. Возможные значения: • Yes —да; •
No — нет (по умолчанию) Атрибут может
использоваться, если страница с формой и страница, указанная атрибутом
ACTION, являются одним и тем же файлом, либо если на странице, указанной
атрибутом ACTION, установлены идентичные управляющие элементы с теми
же именами. Необязательный
атрибут В версии ColdFusion Server 5.0 не используется |
||
Атрибут |
Описание |
||
ONSUBMIT |
Определяет JavaScript-обработчик
активизации формы. Применяется для проверки с помощью кода JavaScript
правильности заполнения элементов формы. Необязательный атрибут |
||
TARGET |
Имя окна или
фрейма, куда будет передан результат заполнения формы. Необязательный
атрибут |
||
ENCTYPE |
MIME-тип для
указания формата посылки данных. По умолчанию принимает значение application/x-www-form-urlencoded,
рекомендуется не изменять. Атрибут включен для совместимости с предыдущими
версиями. Необязательный атрибут |
||
PASSTHROUGH |
Установка возможности
использования HTML-тега <FORM> в комбинации с тегом <CFFORM>
для тега <CFINPUT>. Возможные значения: • Yes -да; •
NO — нет (по умолчанию). Необязательный атрибут |
||
CODEBASE |
URL для разгрузки
(download) дополнения (plug-ins) JRE. Только для Internet Explorer.
Значение по умолчанию /CFiDE/classes/ cf-j2re-win. cab. Необязательный
атрибут |
||
ARCHIVE |
URL для разгрузки
(download) Java-классов управляющих средств (controls) ColdFusion.
Значение по умолчанию /CFiDE/classes/ CFJava2 . jar. Необязательный
атрибут |
||
С помощью
тега <CFINPUT> можно создавать такие управляющие элементы, как текстовые
поля ввода, поля ввода пароля, флажки и переключатели (радиокнопки). За выбор
типа управляющего элемента отвечает обязательный атрибут TYPE тега <CFINPUT>,
который может принимать значения:
Например:
<CFINPUT
TYPE="text" NAME="FirstName" VALUE="Anna" SIZE="10"
MAXLENGTH="11">
Таким образом,
мы создаем текстовое поле с заранее определенным значением "Anna",
указанием размера поля с помощью атрибута SIZE и установкой максимального количества
вводимых символов, используя атрибут MAXLENGTH.
Или, например:
<CFINPUT
TYPE="password" NAME="Password" SIZE="10" MAXLENGTH="11">
С помощью
приведенного примера создаем поле для ввода пароля. Следует отметить, что атрибуты
SIZE и MAXLENGTH не распространяются на элементы С типами radio И checkbox.
Следующий
пример:
<CFINPUT
TYPE="checkbox" NAME="SubDis" VALUE="1" CHECKED="Yes">
Как видно
по установленному атрибуту TYPE, это флажок, и определен он как выбранный по
умолчанию, о чем говорит атрибут CHECKED. Причем передача указанного значения
с помощью атрибута VALUE будет только в том случае, когда флажок отмечен как
выбранный.
И еще один
пример, демонстрирующий уже создание группы переключателей:
Children<CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="1"> Adult><CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="2" CHECKED>
Senior<CFINPUT TYPE="radio" NAME="AgeGroup" VALUE="'3">
В этом примере
отметим следующее, все три элемента имеют общее имя (атрибут NAME равен "AgeGroup"),
тем самым мы указываем, что эти элементы относятся к одной группе, только один
из них может быть выбран, и его значение будет передано. При использовании переключателей
следует указывать значения элементов, используя атрибут VALUE. С помощью атрибута
CHECKED мы указали выбранное по умолчанию значение равное 2. Заметим, что в
ColdFusion для атрибутов с возможными значениями наподобие Yes/No, необязательно
записывать Yes или NO, можно просто указать атрибут, и такая конструкция будет
означать Yes.
Полный код
может выглядеть так:
<HTML>
<HEAD>
<TITLE>CFINPUT</TITLE>
</HEAD> <BODY>
<hl>Log
In</hl>
<TABLE border='0' cellspacing='2' cellpadding='2'>
<CFFORM NAME="Forml" ACTION="LogInGO.cfm">
<TR><TD
align="right">First Name: </TD><TD>
<CFINPUT
TYPE="text" NAME="FirstName" VALUE="Anna"
SIZE="10"
MAXLENGTH="11"> </TDX/TR>
<TR><TD align="right">Password:</TD><TD>
<CFINPUT TYPE="password"
NAME="Password"
SIZE="10" MAXLENGTH="11"> </TD></TR>
<TR><TD
align="right">Age Group:</TD><TD>
Children<CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="1"> Adult<CFINPUT
TYPE="radio" NAME="AgeGroup" VALUE="2" CHECKED
Senior<CFINPUT TYPE="radio" NAME="AgeGroup" VALUE="3">
</TD></TR> <TRXTD align="right">To subscribe for
dispatch:</TD><TD>
<CFINPUT TYPE="checkbox" NAME="SubDis" VALUE="1" CHECKED="Yes"> </TD></TR>
<TR><TD
align="right"xinput type='submit' value='Send'></TD>
<TD><input type='reset' value=' Reset '></TD></TR> </CFFORM>
</TABLE>
</BODY> </HTML>
Для удобства
размещения элементов на странице мы использовали HTML-тег <TABLE>, а флажок
SubDis поместили в конце для придания форме эстетического вида.
При создании
форм достаточно часто приходится проверять правильность заполнения полей формы,
как мы уже неоднократно демонстрировали, как с помощью программ на языке JavaScript,
так и тегов ColdFusion. Однако при использовании тегов <CFINPUT> и <CFTEXTINPUT>
можно проконтролировать введенные данные без написания какого-либо кода, указав
атрибут VALIDATE,
ВХОДЯЩИЙ В ЭТИ тэги.
Атрибут VALIDATE,
в свою очередь, может принимать следующие значения:
При указании
одного из вышеперечисленных значений атрибута VALIDATE также можно установить
атрибут сообщения MESSAGE, которое будет выводиться на экран при заполнении
данными недопустимого формата.
Контроль
с помощью регулярных выражений
Помимо значений,
контролирующих ввод данных с предопределенными правилами при использовании тегов
<CFINPUT> и <CFTEXTINPUT>, можно применять регулярные выражения
(regular expression) для проверки соответствия
текста, вводимого пользователем, собственному образцу, указанному с помощью
атрибута PATTERN. Для определения образца того или иного поля ввода необходимо
использовать обычные символы в сочетании со специальными символами.
Регулярные
выражения позволяют проверять текстовые поля ввода для разнообразных условий.
Можно создавать регулярное выражение, которое соответствует только числам в
определенном диапазоне. Можно объединять простые регулярные выражения в сложные
критерии поиска, чтобы соответствовать сложным образцам, например, одного из
слов с различными окончаниями. Также в регулярных выражениях можно использовать
переменные и функции ColdFusion, т. к. ColdFusion Server вычисляет переменные
и функции прежде, чем определяется регулярное выражение.
В первую
очередь следует отметить, что при формировании образца с помощью регулярного
выражения для отображения специальных символов как обычных, следует использовать
левую наклонную черту \ в качестве предшествующего этому символу. Например,
для отображения знака + следует писать \+.
Специальными
символами следует считать:
-*?.[^$(){|\
Приведем
характерные правила для регулярных выражений. 3 Точка (.) соответствует любому
символу.
Например
(good) ?bye предполагает goodbye или bye.
Также при
формировании регулярных выражений можно использовать escape-последовательности.
Например, такие как:
И Т.Д.
Пример
использования атрибута VALIDATE
Приведенный
ниже пример позволяет продемонстрировать проверку заполняемых полей текущей
формы с помощью атрибута VALIDATE, имеющего как конкретные знанения, так и значения
на основе регулярного выражения, образец которого определен с помощью атрибута.
PATTERN:
<HTML>
<HEAD>
<TITLE>CFFORM
Validation</TITLE> </HEAD> <BODY>
<hl>Sign
Up</hl>
<TABLE border='0' cellspacing='2' cellpadding='0'>
<CFFORM NAME="Forml" ACTION="SignUpGO.cfm" >
<TR><TD align="right">E-Mail</TDXTR>
<CFINPUT TYPE="text"
NAME="EMail"
REQUIRED="Yes"
VALIDATE="Regular_expression"
РАТТЕКЫ="^[A-Za-z0-9_.]+(@){1}[A-Za-zO-9_.]+$"
SIZE="15"
MAXLENGTH="16"> </TD></TR>
<TR><TD align="right">First Name</TD><TD>
<CFINPUT TYPE="text"
NAME="FirstName"
REQUIRED="Yes"
VALIDATE="Regular_expression"
PATTERN="[A-Za-z]"
MESSAGE="First
Name, should not be empty and to include symbols 'A-Za-z'"
SIZE="10",MAXLENGTH="11">
</TD></TR>
<TR><TD align="right">Birthday</TD><TD>
<CFINPUT
TYPE="text" NAME="Birthday"
REQUIRED="Yes"
VALIDATE="Eurodate"
SIZE="10"
MAXLENGTH="11"> </TD></TR>
<TRXTD align="right">Phone Num.</TD><TD>
<CFINPUT TYPE="text"
NAME="PhoneNum"
REQUIRED="Yes"
VALIDATE="Telephone" SIZE="12" MAXLENGTH="13">
</TD></TR> <TR><TD align="right"><input
type='submit' value=' Add '></TD>
<TD><input type='reset' value='Clear'></TD></TR> </CFFORM>
</table>
</BODY> </HTML>
В приведенном
примере мы создаем правила ввода для полей EMail и FirstName, используя регулярные
выражения, и указываем контролирующие значения для полей Birthday и phoneNum
со встроенными правилами. При этом для поля FirstName создаем собственное сообщение
об ошибке.
Контроль
с помощью кода JavaScript
Как отмечалось,
в предыдущих разделах мы уже применяли HTML-тег <FORM>, позволяющий создавать
формы для обработки данных, где, впрочем, уже и использовали код JavaScript
для контроля вводимых данных. При указании тега <CFFORM> также можно добавлять
код JavaScript. Для этой цели следует использовать атрибут ONVALIDATE таких
элементов формы как <CFINPUT>, <CFTEXTINPUT>, <CFSLIDER>,
<CFTREE>, <CFGREED>.
При этом
функции, указанной атрибутом ONVALIDATE, передаются такие объекты, как форма
(form_obj), текущий элемент ввода (input_obj) и значение текущего элемента ввода.
Можно также
использовать атрибут ONERROR для указания функции JavaScript, которая выполняется,
если при заполнении полей формы происходит ошибка, т. е. когда введенные значения
не удовлетворяют установленным правилам, причем независимо от того, с помощью
VALIDATE или ONVALIDATE регулируются эти правила.
Атрибут ONERROR
возможно применять в таких элементах формы, как <CFINPUT>, <CFTEXTINPUT>,
<CFSELECT>, <CFSLIDER>, <CFTREE>, <CFGREED>.
При этом
функции, указанной атрибутом ONERROR, передаются такие объекты, как форма (form_obj),
текущий элемент ввода (input__obj), значение текущего элемента ввода и текст
сообщения об ошибке.
Пример
с использованием JavaScript
Приведенный
далее пример продемонстрирует проверку заполняемых полей текущей формы, используя
как значения атрибута VALIDATE с применением атрибута ONERROR, так и код JavaScript,
указывая при этом названия функций с помощью атрибута ONVALIDATE:
<HTML>
<HEAD>
<TITLE>CFFORM JavaScript Validation</TITLE> </HEAD> <BODY>
<script>
function Birthday_error(form, input, val, mess)
{ input.value='dd/mm/yyyy'; alert(mess); }
function Pass_(form){
if (form.Pass.value == "")
{ return (false); }
else { return (true); } }
function Conf_(form,
input, val){
if (form.Pass.value = val)
{ return (true); }
else { return
(false); } }
</script>
<hl>Sign Up</hl>
<TABLE border='0' cellspacing='2' cellpadding='0'>
<CFFORM NAME="Forml" ACTION="SignUpGO.cfm" >
<TR><TD align="right">First Name</td><td>
<CFINPUT TYPE="text"
NAME="FirstName"
REQUIRED="Yes"
VALIDATE="Regular_expression" PATTERN="[A-Za-z]" SIZE="10"
MAXLENGTH="11"> </TD></TR>
<TR><TD align="right">Birthday</TD><TD>
<CFINPUT TYPE="text"
NAME="Birthday"
REQUIRED="Yes"
VALIDATE="Eurodate" ONERROR="Birthday_error" SIZE="10"
MAXLENGTH="11"> </TD></TR>
<TR><TD align="right">Password</TD><TD>
<CFINPUT TYPE="password"
NAME="Pass"
REQUIRED="Yes"
ONVALIDATE="Pass_" MESSAGE="Password, should not be empty"
SIZE="8" MAXLENGTH="9"> </TD></TR>
<TR><TD align="right">Confirm</TD><TD>
<CFINPUT TYPE="password"
NAME="Conf"
REQUIRED="Yes"
ONVALIDATE="Conf_" MESSAGE="Fields: Password and Confirm,
should be identical!"
SIZE="8" MAXLENGTH="9"> </TD></TR>
<TRXTD align="right"xinput type='submit' value=' Add '></TD>
<TD><input type='reset' value='Clear'></TD></TR>
</CFFORM> </TABLE>
</BODY>
</HTML>
В приведенном
примере мы создаем правила ввода для поля FirstName, используя регулярное выражение,
указываем контролирующее значение для поля Birthday со встроенным правилом с
помощью атрибута ONERROR и устанавливаем для полей Pass и conf контроль над
вводом данных с помощью JavaScript.
В то же время
вы можете добавить HTML-тег <FORM> в комбинации с тегом <CFFORM>,
используя атрибут PASSTHROUGH следующим образом:
<HTML>
<HEAD>
<TITLE>CFFORM(PASSTHROUGH)
JavaScript Validation</TITLE> </HEAD> <BODY> <script>
function FName(val){
if(val=="")
return false; else return true; }
</script>
<hl>Sign Up</hl>
<TABLE border='0' cellspacing='2' cellpadding='0'>
<CFFORM NAME="Form1" ACTION="SignUpGO.cfm">
<TR><TD align="right">First Name</TD><TD>
<CFINPUT TYPE="text" NAME="FirstName"
REQUIRED="Yes" SIZE="10" MAXLENGTH="11" MESSAGE="First Name,
should not be
empty" PASSTHROUGH="Yes" onClick = "FName(this.value)">
</TD></TR>
<TR><TD align="right"xinput type='submit' value=' Add '></TD>
<TD><input type=' reset' value=' Clear'></TD></TR> </CFFORM>
</TABLE>
</BODY> </HTML>
В приведенном
примере мы указываем атрибут PASSTHROUGH для поля FirstName и определяем при
возникновении события onclick выполнение функции FName (this, value), что позволяет
контролировать ввод данных для этого поля с помощью JavaScript.
Тег <CFTEXTINPUT>
позволяет создавать текстовые поля ввода с возможностью форматирования текста.
Этот управляющий элемент реализован на основании Java-апплета.
Например:
<CFTEXTINPUT
NAME="textblockl"
HEIGHT="80" WIDTH="400" ALIGN="Top"
BGCOLOR="##8080CO"
TEXTCOLOR="White" BOLD="Yes" ITALIC="Yes"
FONTSI2E="72"
VALUE="TextBlockl">
Здесь с помощью
обязательного атрибута NAME задаем имя элемента <CFTEXTINPUT>, указываем
высоту и ширину текстового поля в пикселах, используя атрибуты HEIGHT и WIDTH,
задаем выравнивание поля по верхнему краю с помощью атрибута ALIGN, устанавливаем
цвет заливки фона и цвет текста с помощью атрибутов BGCOLOR и TEXTCOLOR, придаем
тексту жирный и наклонный характер, используя атрибуты BOLD и ITALIC, а также
определяем размер шрифта атрибутом FONTSIZE и устанавливаем значение текстового
поля атрибутом VALUE.
Заметим,
что для назначения цвета необходимо использовать двойной символ # перед шестнадцатеричным
числовым кодом или задавать цвет по названию, используя перечисленные ниже значения:
И еще один
пример из разряда применения тега <CFTEXTINPUT>:
<CFTEXTINPUT
NAME="textblock2"
HEIGHT="40" WIDTH="400" ALIGN="Bottom"
BGCOLOR="IIFFFFD5"
TEXTCOLOR="Gray" FONTSIZE="36" VSPACE="5"
FONT="Zurich
Ex ВТ" VALUE="TextBlock2">
Здесь в отличие
от предыдущего примера добавлены еще два атрибута: VSPACE, позволяющий устанавливать
величину незаполненного пространства в пикселах сверху и снизу от содержащего
данный атрибут элемента, и FONT, предоставляющий возможность указывать шрифт
текста.
Включим описанные
примеры в одну страницу следующим образом:
<HTML>
<HEAD>
<TITLE>CFTEXTINPUT</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFFORM NAME="Forml" ACTION="CFTEXTINPUT_.cfm">
<CFTEXTINPUT
NAME="textblockl"
HEIGHT="80" WIDTH="400" ALIGN="Top" BGCOLOR="##8080CO" TEXTCOLOR="White"
BOLD="Yes" ITALIC="Yes" FONTSIZE="72" VALUE="TextBlockl">
<CFTEXTINPUT
NAME="textblock2"
HEIGHT="40"
WIDTH="400" ALIGN="Bottom" BGCOLOR="#FFFFD5" TEXTCOLOR="Gray"
FONTSIZE="36" VSPACE="5" FONT="Zurich Ex ВТ" VALUE="TextBlock2">
</CFFORM>
</BODY>
</HTML>
Мы не обсуждаем
все существующие атрибуты тега <CFTEXTINPUT> и их возможные значения детально,
но уверяем, их осталось не так много. Тег <CFTEXTINPUT>,
так же, как и тег <CFINPUT>, поддерживает атрибуты
MESSAGE, ONERROR,
REQUIRED,VALIDATE И ONVALIDATE.
Тег <CFSELECT>
задает список, позволяющий выбирать один или несколько вариантов из списка.
Если атрибут MULTIPLE не указан, то создается простой раскрывающийся список,
в котором можно выбирать только один вариант. Его значение всегда передается,
т. к. всегда хотя бы один пункт выбран. При указании атрибута MULTIPLE можно
выбирать несколько значений. Синтаксис данного тега аналогичен синтаксису HTML-тега
<s'eiect>.
Например:
<CFSELECT
NAME="Destinationl">
<OPTION VALUE="l">World
Trade Center
<OPTION VALUE="2">World
Financial Center
<OPTION VALUE="3">Museum
of Jewish Heritage
<DPTION VALUE="4">Battery
Park </CFSELECT>
Здесь с помощью
обязательного атрибута NAME задаем наименование элемента <CFSELECT> и
указываем опции списка, используя знакомую конструкцию. Во всяком случае, эта
конструкция хорошо знакома тем, кому доводилось применять НТМ-тег oeiectx
Так же, как
и при использовании HTML-тега <seiect>, можно устанавливать значение по
умолчанию, добавив при этом атрибут SELECTED для конкретной опции. Например:
<CFSELECT
NAME="Destination2" SIZE="3">
<OPTION VALUE="l">Ellis
Island
<OPTION VALUE="2">Wall
Street
<OPTION VALUE="3"
SELECTED>Statue of Liberty </CFSELECT>
В приведенном
примере мы указали размер видимой части списка с помощью атрибута SIZE, однако
это еще не повод, чтобы выбирать сразу несколько опций, удерживая клавиши <Ctrl>
и <Shift>. Для подобной возможности, как было сказано, необходимо добавить
атрибут MULTIPLE. Например:
<CFQUERY NAME="GetTour" DATASOURCE="#application.dsn#">
SELECT Key_tou,
Name_tou
FROM Tour </CFQUERY>
<CFSELECT NAME="Tourl" MULTIPLE="Yes" SIZE="3">
<CFOUTPUT
QUERY-"GctTour">
<OPTION VALUE="#key_tou#">#name_tou#
</CFOUTPUT>
</CFSELECT>
В этом фрагменте
кода в первую очередь следует обратить внимание на предварительно построенный
запрос с помощью тега <CFQUERY>, который обсуждался в предыдущей главе.
Это позволяет нам определять значения опций из базы данных. Однако для использования
данных запроса в теге <CFSELECT> присутствуют следующие атрибуты: QUERY
- имя запроса, VALUE — колонка запроса, выступающая в качестве значений списка,
и DISPLAY — колонка запроса, отображаемая в списке. Например:
<CFQUERY
NAME="GetTour" DATASOURCE="#application.dsn#">
SELECT Key__tou,
Name_tou
FROM Tour </CFQUERY>
<CFSELECT NAME="Tour2" MULTIPLE="Yes" SELECTED="3"
QUERY="GetTour"
VALUE="key_tou" DISPLAY="name_tou"> </CFSELECT>
Атрибут SELECTED
мы добавили исключительно для демонстрации указания значения по умолчанию.
Включим описанные
примеры в одну страницу следующим образом:
<HTML>
<HEAD>
<TITLE>CFSELECT</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFQUERY
NAME="GetTour" DATASOURCE="#application.dsnf"> SELECT
Key_tou, Name_tou
FROM Tour </CFQUERY>
<CFFORM NAME="Forml" ACTION="CFSELECT_.cfm">
<CFSELECT
NAME="Destinationl">
<OPTION VALUE="l">World Trade Center
<OPTION VALUE="2">World Financial Center
<OPTION VALUE="3">Museum of Jewish Heritage
<OPTION VALUE="4">Battery
Park
</CFSELECT>
<br>
<CFSELECT NAME="Destination2" SIZE="3">
<DPTION VALUE="l">Ellis Island
<OPTION VALUE="2">Wall Street
<OPTION VALUE="3"
SELECTED>Statue of Liberty </CFSELECT> <br>
<CFSELECT NAME="Tourl" MULTIPLE="Yes" SIZE="3">
<CFOUTPUT
QUERY="GetTour">
<OPTION VALTJE="#key_toul">#name_toul </CFOUTPUT> </CFSELECT> <br>
<CFSELECT
NAME="Tour2" MULTIPLE="Yes" SELECTED="3"
QUERY="GetTour"
VALUE="key_tou" DISPLAY="name_tou"> </CFSELECT>
</CFFORM> </BODY> </HTML>
Тег <CFSELECT>,
так же, как теги <CFINPUT> и <CFTEXTINPUT>, поддерживает атрибуты
MESSAGE, ONERROR И REQUIRED, и, кроме того, атрибут PASSTHROUGH.
Тег <CFSLIDER>
позволяет разместить в форме движок со шкалой или без нее, перемещаемый по вертикали
или горизонтали и предоставляющий возможность визуально управлять числовыми
величинами в указанном диапазоне. Этот управляющий элемент реализован на основании
Java-апплета.
Например:
<CFSLIDER
NAME="my1" RANGE="0,100" SCALE="1" VALUE="33"
HEIGHT="25">
Здесь с помощью
обязательного атрибута NAME задаем имя элемента <CFSLIDER>, определяем
диапазон значений движка атрибутом RANGE, указываем масштаб шкалы движка с помощью
атрибута SCALE, а также устанавливаем значение по умолчанию, используя атрибут
VALUE, и указываем ширину горизонтального движка в пикселах атрибутом HEIGHT.
По умолчанию
значение диапазона, устанавливаемого с помощью атрибута RANGE, равно от 0 до
100, а значение шкалы движка SCALE равно 1. То есть приведенный выше пример
можно видоизменить, и результат при этом будет тождественен:
<CFSLIDER
NAME="my1" VALUE="33" HEIGHT="25">
При размещении
движка можно добавить подпись (label) с отображением текущего значения данного
управляющего элемента, как показано в следующем примере:
<CFSLIDER
NAME="my2" VALUE="50"
VSPACE="5" BGCOLOR="Gray" TEXTCOLOR="##FFFFD5"
LABEL="Value
Slider: " WIDTH="200" HEIGHT="45">
Здесь помимо
атрибута LABEL для отображения подписи задаются уже известные атрибуты, используемые
в описанных выше управляющих элементах.
С помощью
атрибута TICKMARKLABELS можно включить .отображение подписи шкалы движка с шагом,
соответствующим масштабу шкалы, указанному атрибутом SCALE, как это показано
в следующем примере:
<CFSLIDER NAME="my3" RANGE="0,50" SCALE="10"
VALUE="10" LABEL="Value Slider: " WIDTH="200"
HEIGHT="60"
TICKMARKLABELS="Yes">
Также можно
включать отображение самой шкалы, в виде линейки с засечками, добавив при этом
атрибуты TICKMARKMAJOR или TICKMARKMINOR. И если в первом случае будут отображены
только основные засечки в соответствии с установленным масштабом, то при использовании
TICKMARKMINOR также будут показаны промежуточные засечки меньшей величины.
Например:
<CFSLIDER NAME="my4" RANGF,= "50,100" SCALE="10"
VALUK="90" HSPACE="5" WIDTH="200"
HEIGHT="60"
TICKMARKMINOR="True" TICKMARKLABELS="Yes">
Здесь HSPACE
позволяет устанавливать величину незаполненного пространства в пикселах слева
и справа от содержащего данный атрибут элемента.
Если вас
не устраивает, что в качестве подписи шкалы отображаются число-вые величины
в указанном диапазоне, то, используя атрибут TICKMARKLABELS, можно сформировать
собственный список значений, который станет отображаться в виде подписей шкалы.
Причем, если диапазон меньше указанного количества элементов списка, лишние
элементы будут игнорироваться, если же, наоборот, диапазон будет превосходить
количество" элементов списка, то последний элемент повторится. Приведем
пример со списком времен года:
<CFSLIDER
NAME="my5" RANGE="1,4" VALUE="1"
VSPACE="S" LABEL="Seasons: " WIDTH="300" HEIGHT="70"
TICKMARKMINOR="True"
TICKMARKLABELS="Winter,Spring,Summer,Autumn"
FONT="Impact"
BOLD="Yes" FONTSIZE="14">
В этом фрагменте
добавлены атрибуты FONT, BOLD и FONTSIZE, позволяющие форматировать подпись,
указанную атрибутом LABEL.
Все предыдущие
примеры демонстрировали движки в горизонтальном по-ложении. Если же есть необходимость
изобразить движок вертикально, то достаточно включить атрибут VERTICAL, как
показано в следующем примере:
<CFSLIDER
NAME="my6" RANGE="1,5" VALUE="1"
WIDTH="120" HEIGHT="120" VERTICAL="True"
TICKMARKMINOR="True" LABEL=" Language: "
TICKMARKLABELS="Russian,English,German,Spanish,French"
TICKMARKIMAGES="rus.gif,eng.gif,ger.gif,
spa.gif, fre.gif">
Здесь присутствует
еще один интересный атрибут, TICKMARKIMAGES, предполгающий перечисление через
запятую графических файлов, содержимое которых в свою очередь будет выведено
между шкалой и подписью шкалы. При этом, так же, как и с атрибутом TICKMARKLABELS,
если диапазон меньше уканного количества графических файлов, лишние рисунки
будут игнорироваться, если же, наоборот, диапазон будет превосходить количество
графических файлов, то последний рисунок, указанный с помощью атрибута TICKMARKIMAGES,
повторяется n раз.
Сведем
все воедино:
<HTML>
<HEAD>
<TITLE>CFSLIDER</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFFORM NAME="Forml"
ACTION="CFSLIDER_.cfm">
<CFSLIDER NAME="myl" RANGE="0,100"
SCALE="1"
VALUE="33"
HEIGHT="25">
<br> <CFSLIDER NAME="my2" VALUE="50"
VSPACE="5" BGCOLOR="Gray"
TEXTCOLOR="##FFFFD5"
LABEL="Value Slider: " WIDTH="200"
HEIGHT="45"> <br>
<CFSLIDER NAME="my3" RANGE="0,50"
SCALE="10"
VALUE="10"
LABEL="Value Slider: " WIDTH="200"
HEIGHT="60"
TICKMARKLABELS="Yes">
<CFSLIDER NAME="my4" RANGE="50,
100" SCALE="10"
VALUE="90"
HSPACE="5"
WIDTH="200" HEIGHT="60" "
TICKMARKMAJOR="True"
TICKMARKMINOR="True"
TICKMARKLABELS="Yes"> <br>
<CFSLIDER
NAME="my5" RANGE="1,4" VALUE="1"
VSPACE="5"
LABEL="Seasons: " WIDTH="300" HEIGHT="70"
TICKMARKMINOR="True"
TICKMARKLABELS="Winter,Spring,Summer,Autumn"
FONT="Impact" BOLD="Yes" FONTSIZE="14"> <br>
<CFSLIDER
NAME="my6" RANGE="1,5" VALUE="1"
WIDTH="120"
HEIGHT="120" VERTICAL="True"
TICKMARKMINOR="True"
LABEL=" Language: "
TICKMARKLABELS="Russian,English,German,Spanish,French"
TICKMARKIMAGES="rus.gif,eng.gif,
ger.gif,spa.gif,fre.gif">
</CFFORM>
</BODY> </HTML>
Стоит отметить
еще один занимательный атрибут управляющего элемента <CFSLIDER>.
ЭТО LOOKANDFEEL, который применяется для задания стиля элементов и может
принимать следующие значения:
Например,
изменим уже представленные примеры, добавив стиль Motif, как это показано для
одного из первых примеров:
<CFSLIDER NAME="my1" RANGE="0,100" SCALE="1"
VALUE="33"
HEIGHT="25" LOOKANDFEEL="Motif">
Ter <CFSLIDER>, так же, как теги <CFINPUT> и <CFTEXTINPUT>, поддерживает атрибуты MESSAGE, ONERROR И ONVALIDATE.
Тег <CFTREE>
позволяет разместить в форме дерево объектов и представляет собой элемент управления
для создания иерархического списка, в котором каждый пункт может иметь подчиненный
пункт или набор пунктов, выводимых с отступом. Пользователь может сворачивать
список, делая невидимым подчиненные пункты, или, наоборот, раскрывать иерархию
управляющего элемента. Пункт дерева может содержать текст и изображение. Этот
управляющий элемент реализован на основе Java-апплета.
Для реализации
пунктов необходимо внутри тега <CFTREE> использовать тег <CFTREEITEM>.
Например, представим код страницы без использования запроса:
<HTML>
<HEAD>
<TITLE>CFTREE</TITLE> </HEAD>
<BODY bgcolor="Silver">
<hl>Structuring
Tegs</hl>
<CFFORM NAME="Forml"
ACTION="CFTREE_GO.cfm">
<CFTREE NAME="StructuringTegs"
HEIGHT="270" WIDTH="230"
ALIGN="TOP" COMPLETEPATH="Yes">
<CFTREEITEM VALUE="1.CFFORM">
<CFTREEITEM VALUE="2.FORM">
<CFTREEITEM
VALUE="1.1.CFINPUT"
PARENT="1.CFFORM" IMG="Element">
<CFTREEITEM
VALUE="1.2.CFTEXTINPUT"
PARENT="1.CFFORM" IMG="Element">
<CFTREEITEM
VALUE="1.3.CFSELECT"
PARENT="1.CFFORM" IMG="Element">
<CFTREEITEM
VALUE="1.4.CFSLIDER"
PARENT="1.CFFORM" IMG="Element">
<CFTREEITEM
VALUE="1.5.CFTREE"
PARENT="1.CFFORM"
IMG="Element">
<CFTREEITEM
VALUE="1.6.CFGRID"
PARENT="1.CFFORM" IMG="Element">
<CFTREEITEM
VALUE="1.7.CFAPPLET"
PARENT="1.CFFORM" IMG="Element">
<CFTREEITEM
VALUE="2.1.INPUT"
PARENT="2.FORM" IMG="Element">
<CFTREEITEM
VALUE="2.2.TEXTAREA"
PARENT="2.FORM" IMG="Element">
<CFTREEITEM
VALUE="2.3.SELECT"
PARENT="2.FORM" IMG="Element">
<CFTREEITEM
VALUE="1.5.1.CFTREEITEM"
PARENT="1.5.CFTREE" IMG="Document">
<CFTREEITEM
VALUE="1.6.1.CFGRIDCOLUMN"
PARENT="1.6.CFGRID" IMG="Document">
<CFTREEITEM
VALUE="1.6.2.CFGRIDROW"
PARENT="1.6.CFGRID" IMG="Document">
</CFTREE>
<input type='submit' value='Send'>
</CFFORM> </BODY>
</HTML>
Здесь обязательный
атрибут VALUE тега <CFTREEITEM> задает значение пункта, а атрибут PARENT
указывает на принадлежность к пункту более старшего
уровня иерархии
или, как говорят, позволяет указать родителя. Атрибут IMG предоставляет возможность
выбрать изображение для данного пункта, причем варианты могут быть следующие:
Впрочем,
если ни один из существующих вариантов вас не устраивает, для атрибута IMG можно
указывать путь к графическому файлу, который будет играть роль изображения для
текущего пункта, как это будет показано ниже.
Управляющий
элемент <CFTREE> позволяет выбирать один из пунктов иерархического списка,
и при обработке формы передаются две переменные:
Чтобы возвращать
часть корня пути (root), необходимо установить атрибут COMPLETEPATH тега <CFTREE>,
как показано в предыдущем примере. Причем, если пользователь выбирает пункт
"1.5.1.CFTREEITEM", в этом случае будут переданы переменные:
Form.StructuringTegs.node
= 1.5.1.CFTREEITEM
Form.StructuringTegs.path
= 1 .CFFORMM. 5.CFTREEM. 5 .1 .CFTREEITEM
По умолчанию
в качестве разделителя применяется левая наклонная черта. Однако, используя
атрибут DELIMITER тега <CFTREE>, этот разделительный символ всегда можно
изменить.
Следующим
примером мы предваряем создание иерархического списка с использованием запросов
и применением гипертекстовых ссылок:
<HTML>
<HEAD>
<TITLE>CFTREE</TITLE>
</HEAD> <BODY bgcolor="Silver">
<CFQUERY NAME="GetTraveler" DATASOURCE="#application.dsn#">
SELECT Key_tra,
'mailto:' + EMail_tra AS EMail,
FirstName_tra
+ ' '+ LastName_tra AS TName FROM Traveler
ORDER BY FirstName_tra,
LastName_tra </CFQUERY>
<hl>Travelers
Tree</hl>
<CFFORM NAME="Forml" ACTION="CFTREE_2.cfm">
<CFTREE NAME="Tour"
HEIGHT="290" WIDTH="190"
HSCROLL="No" FONTSIZE="13" FONT="Trebuchet MS">
<CFTREEITEM
VALUE="Key_tra" DISPLAY="TName"
QUERY="GetTraveler"
QUERYASROOT="Travelers" IMG="People.gif,BulletCircle.gif"
HREF=",EMail">
</CFTREE>
</CFFORM> </BODY> </HTML>
Здесь предварительно
создается запрос с необходимыми данными, после чего указывается обязательный
атрибут VALUE и имя запроса с помощью атрибута QUERY тега <CFTREEITEM>.
В качестве атрибута VALUE задается одно или несколько полей запроса, перечисленных
через запятую. Причем каждое последующее указанное поле будет представляться
в качестве вложенного пункта в предыдущее поле. Если необходимо в списке отобразить
одни поля базы данных, а в качестве передаваемых значений использовать другие,
то для этой цели следует добавить атрибут DISPLAY.
Атрибут QUERYASROOT
указывает на использование имени запроса как верхнего уровня иерархического
списка и может принимать следующие значения:
Еще одной
из интересных деталей приведенного примера является использование атрибута HREF,
позволяющего представлять надписи пунктов списка в виде гипертекстовых ссылок.
Как можно было заметить, в нашем примере мы извлекаем из базы данных почтовые
адреса путешественников и добавляем в начало каждого адреса строку "mailto:",
что даст возможность пользователю отправлять письма по адресу того или иного
путешественника. Заметим, что в нашем примере атрибут HREF указывает .на наличие
гипертекстовых ссылок для второго уровня иерархического списка, о чем свидетельствует
наличие запятой. Также можно напрямую указывать ссылку на вызываемый ресурс,
например:
HREF = "http://www.youserver.com"
При этом,
когда пользователь выбирает один из пунктов иерархического списка, чтобы активизировать
данный ресурс, то в конец URL добавляется строка, позволяющая .передавать значение
выбранного пункта в качестве переменной по следующему правилу:
http://www.youserver.com?CFTREEITEMKEY=selected_value
Для отключения
добавления переменной в конец URL следует при использовании тега <CFTREE>
установить атрибут APPENDKEY="NO". Например, несколько видоизменим
приведенный выше пример:
<CFFORM NAME="Forml" ACTION="CFTREE_2.cfm">
<CFTREE NAME="Tour"
HEIGHT="290" WIDTH="190"
HSCROLL="No" FONTSIZE="13" FONT="Trebuchet MS" APPENDKEY="No">
<CFTREEITEM
VALUE="Key_tra" DISPLAY="TName"
QUERY="GetTraveler" QUERYASROOT="Travelers"
IMG="People.gif,BulletCircle.gif" HREF="http://localhost,EMail" TARGET="_blank">
</CFTREE>
</CFFORM>
В данном
фрагменте был включен еще один атрибут, TARGET, позволяющий указывать правило
открытия целевой страницы. В нашем случае значение _biank открывает по ссылке
страницу в новом окне обозревателя. Так же, используя этот атрибут, можно задавать
имя фрейма. Заметим, что мы указываем правило открытия страницы только для первого
уровня иерархического списка. В этом же примере мы устанавливаем следующие атрибуты:
HSCROLL, который отвечает за отображение горизонтальной полосы прокрутки, FONTSIZE
и FONT, которые отвечают за форматирование текста, и уже упомянутый атрибут
IMG, предоставляющий возможность указать изображения для каждого уровня иерархического
списка.
Представим
еще один пример создания иерархического списка с использованием запроса:
<HTML>
<HEAD>
<TITLE>CFTREE</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFQUERY NAME="GetRoute" DATASOURCE="tapplication.dsn#">
SELECT Key_rou, Name_tou, Name_des
FROM Tour, Destination,
Route WHERE Route.key_tou=Tour.key_tou
AND Route.key_des=Destination.key_des
</CFQUERY>
<hl>Routes Tree</hl> <CFFORM NAME="Forml"
ACTION="CFTREE_3.cfm">
<CFTREE NAME="Route" HEIGHT="250" WIDTH="260" HSCROLL="No">
<CFTREEITEM VALUE="Name_tou, Name_des"
QUERY="GetRoute" EXPAND="No"
IMG="bulletL.gif,bullet.gif" IMGOPEN="bulletL2.gif">
</CFTREE>
</CFFORM> </BODY> </HTML>
Здесь с помощью
атрибута VALUE указаны два поля, данные первого из которых будут представлены
как основной уровень, а данные второго будут включены в качестве подчиненного
уровня иерархического списка. В этом примере мы использовали атрибут IMGOPEN,
позволяющий назначить изображение для пункта, находящегося в раскрытом состоянии,
причем данный атрибут может принимать значения, аналогичные атрибуту IMG. Атрибут
EXPAND, также примененный в последнем примере, позволяет определить состояние
пунктов: в раскрытом виде с отображаемыми подпунктами — значение Yes (по умолчанию),
в скрытом с невидимыми подпунктами — значение NO.
Отметим,
что так же, как была скрыта горизонтальная полоса прокрутки управляющего элемента
<CFTREE> с использованием атрибута HSCROLL, можно скрыть вертикальную
полосу прокрутки, указав атрибут VSCROLL. Управляющий элемент <CFTREE>,
так же, как и <CFSLIDER>, поддерживает использование атрибута LOOKANDFEEL,
который позволяет задавать один из представленных стилей, Motif, Windows (по
умолчанию) или Metal.
Тег <CFTREE>
подобно тегам <CFINPUT>, <CFTEXTINPUT> и <CFSLIDER> поддерживает
атрибуты MESSAGE, ONERROR И ONVALIDATE.
Тег <CFGRID>
отображает сетку для данных, позволяющую организовать работу с данными в виде
таблицы со строками и колонками. Этот управляющий элемент реализован на основе
Java-апплета.
Управляющий
элемент <CFGRID> позволяет:
И подключать
данные, используя запросы к базам данных;
И представлять
надписи командных кнопок в виде изображений;
Для управления
колонками и строками в <CFGRID> необходимо использовать теги
<CFGRIDCOLUMN> и <CFGRIDROW>. Например, создадим сетку с четырьмя
колонками и двумя строками:
<HTML>
<HEAD>
<TITLE>CFGRID</TITLE>
</HEAD>
<BODY bgcolor="Silver">
<hl>Grid</hl>
<CFFORM NAME="Forml"
ACTION="CFGRID_1.cfm"> <CFGRID NAME="myGrid"
WIDTH="240" HEIGHT="90" SELECTMODE="Single">
<CFGRIDCOLUMN NAME="One">
<CFGRIDCOLUMN NAME="Two">
<CFGRIDCOLUMN NAME="Three">
<CFGRIDCOLUMN NAME="Pic" TYPE="Image">
<CFGRIDROW DATA="1,2,3,bulletL.gif">
<CFGRIDROW DATA="4,5,6,bulletL2.gif"> </CFGRID>
</CFFORM>
</BODY> </HTML>
Здесь четвертая
колонка представляет графические изображения, т. к. с помощью атрибута TYPE
тега <CFGRIDCOLUMN> указан соответствующий тип. Типы данных могут быть
следующими:
В свою очередь,
сами изображения указаны как ссылка на графические файлы. Впрочем, здесь можно
назначать уже известные изображения такие как Cd (компакт-ДИСК), Computer (компьютер),
Document (документ), Element (элемент),
Folder (папка), Floppy (накопитель для гибких дисков), Fixed (подсоединенное
устройство), Remote (сетевое устройство).
Немаловажным
является атрибут SELECTMODE тега <CFGRID>, предназначенный для выбора
способа отражения и поведения данных, который может принимать следующие значения:
Приведенный
ниже пример интересен тем, что данные элемента <CFGRID> определяются запросом
к базе данных при использовании атрибута QUERY:
<HTML>
<HEAD>
<TITLE>CFGRID</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFQUERY
NAME="GetTraveler" DATASOURCE="#application.dsn#"> SELECT
*
FROM Traveler
ORDER BY FirstName_tra,
LastName_tra </CFQUERY>
<hl>Travelers Grid</hl>
<CFFORM NAME="Forml"
ACTION="CFGRID__2.cfm">
<CFGRID NAME="TravelerGrid"
QUERY="GetTraveler" WIDTH="390" HEIGHT="285"
AUTOWIDTH="Yes"
SELECTMODE-"Single">
<CFGRIDCOLUMN NAME="FirstName_tra" HEADER="First Name">
<CFGRIDCOLUMN NAME-"LastName_tra" HEADER="Last Name">
<CFGRIDCOLUMN NAME="EMail_tra" HEADER="E-Mail" WIDTH="110">
<CFGRIDCOLUMN NAME="Birthday_tra" HEADER="Birthday" WIDTH="70">
</CFGRID> </CFFORM>
</BODY>
</HTML>
Обращаем ваше внимание на то, что атрибут HEADER тега <CFGRIDCOLUMN> необязателен, однако полезен, когда текст заголовка колонки требуется специфицировать, как отличный от наименования поля таблицы данных. Атрибут же NAME указывает на поле таблицы данных, которые будут отражены в колонке. При отсутствии атрибута HEADER значение атрибута NAME отражается в качестве заголовка. Использованный в этом примере атрибут AUTOWIDTH обеспечивает автоматическое выравнивание ширины каждой колонки так, чтобы все колонки были видимы в пределах ширины, указанной атрибутом WIDTH тега <CFGRID>. При этом ширина указанных явно колонок остается неизменной.
Управляющий
элемент <CFGRID> достаточно богат возможностями форматирования фона, данных,
заголовка и колонки с порядковыми номерами. В следующем примере тег <CFGRID>
дополнен целым рядом атрибутов, отвечающих за визуальное отображение элемента:
<HTML>
<HEAD>
<TITLE>CFGRID</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFQUERY
NAME="GetTraveler" DATASOURCE="lapplication.dsnt"> SELECT
*
FROM Traveler
ORDER BY FirstName_tra,
LastName_tra </CFQUERY>
<hl>Travelers Grid</hl>
<CFFORM NAME="Forml"
ACTION="CFGRID_3.cfm">
<CFGRID NAME="TravelerGrid" QUERY="GetTraveler"
WIDTH="470" HEIGHT="270" AUTOWIDTH="Yes"
SELECTMODE="Single"
COLHEADERALIGN="Center"
FONT="Zurich Ex ВТ"
FONTSIZE="11"
COLHEADERFONT="Zurich
BlkEx ВТ"
ROWHEADERFONT="Zurich
Ex ВТ"
COLHEADERFONTSIZE="11" ROWHEADERFONTSIZE="8"
SELECTCOLOR="##808040" ROWHEIGHT="24" BGCOLOR="##EDECEO"
TEXTCOLOR="##696934">
<CFGRIDCOLUMN NAME="FirstName_tra" HEADER="First Name">
<CFGRIDCOLUMN NAME="LastName_tra" HEADER="Last Name">
<CFGRIDCOLUMN NAME="EMail_tra" HEADER="E-Mail" WIDTH="110">
<CFGRIDCOLUMN NAME="Birthday_tra" HEADER="Birthday" WIDTH="70">
</CFGRID>
</CFFORM> </BODY> </HTML>
Здесь атрибут
COLHEADERALIGN позволяет выравнивать заголовок по центру (Center), по левому
(Left) или по правому (Right) краю. Атрибутами COLHEADERFONT И ROWHEADERFONT
Задаем шрифт заголовка колонок и шрифт колонки с порядковыми номерами, атрибутами
COLHEADERFONTSIZE и POWHEADERFONTSIZE назначаем размер шрифта заголовка колонок
и колонки с порядковыми номерами. Атрибутом SELECTCOLOR определяем цвет выделенной
ячейки или ячеек, если атрибут SELECTMODE принимает значение ROW или Column,
а также с помощью атрибута ROWHEIGHT задаем высоту рядов. В свою очередь атрибутами
FONT, FONTSIZE, TEXTCOLOR и BGCOLOR назначаем шрифт, размер, цвет и фон текста
данных.
Как мы уже
отметили, в качестве типа колонки можно задавать значение, равное Boolean, представляя
тем самым колонку в виде флажка (checkbox), предназначенного для данных с логическим
значением. В следующем примере добавлена новая колонка, отражающая пол зарегистрированных
путешественников, в виде флажка:
<HTML>
<HEAD>
<TITLE>CFGRID</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFQUERY
NAME="GetTraveler" DATASOURCE="tapplication.dsn#"> SELECT
*
FROM Traveler
ORDER BY FirstName_tra,
LastName_tra </CFQUERY>
<hl>Travelers Grid</hl>
<CFFORM NAME="Forml"ACTION="CFGRID_4.cfm">
<CFGRID NAME="TravelerGrid"
QUERY="GetTraveler" WIDTH="500"
HEIGHT="280" AUTOWIDTH="Yes" SELECTMODE="Column"
COLHEADERALIGN="Center"
FONT="Zurich
Ex ВТ" FONTSIZE="11"
COLHEADERFONT="Zurich BlkEx ВТ"
ROWHEADERFONT="Zurich
Ex ВТ"
COLHEADERFONTSIZE="11" ROWHEADERFONTSIZE="8"
SELECTCOLOR="##808040" ROWHEIGHT="24"
BGCOLOR="##EDECE0" TEXTCOLOR="##696934" SORT="Yes"
SORTASCENDINGBUTTON="Asc"
SORTDESCENDINGBUTTON="Desc">
<CFGRIDCOLUMN NAME="FirstName_tra" HEADER="First Name">
<CFGRIDCOLUMN NAME="LastName_tra" HEADER="Last Narae">
<CFGRIDCOLUMN NAME="EMail_tra" HEADER="E-Mail" WIDTH="110">
<CFGRIDCOLUMN
NAME="Gender_tra" HEADER="M/W" WIDTH="30"
TYPE="Boolean">
<CFGRIDCOLUMN NAME="Birthday_tra" HEADER="Birthday" WIDTH="70">
</CFGRID>
</CFFORM> </BODY> </HTML>
В данном
фрагменте кода также использован атрибут SORT тега <CFGRID>, указывающий
на размещение в нижней части управляющего элемента дополнительных кнопок для
сортировки данных. Атрибуты SORTASCENDINGBUTTON
И SORTDESCENDINGBUTTON позволяют указывать собственный текст на кнопках. По
умолчанию в качестве текста кнопок сортировки принимаются значения sortAsc и
sortoesc.
Тег <CFGRIDCOLUMN>,
так же, как и тег <CFTREEITEM>, поддерживает атрибуты HREF,
HREFKEY И TARGET, позволяющие создать гипертекстовые ссылки, передавать
значение выбранной записи в качестве переменной и указывать правило открытия
целевой страницы.
Далее приведем
пример, где две колонки являются ссылками.
<HTML>
<HEAD>
<TITLE>CFGRID</TITLE>
</HEAD>
<BODY.bgcolor="Silver" alink="#107098" link="#0ClC47" vlink="#003366">
<CFQUERY NAME="GetTraveler" DATASOURCE="#application.dsn#">
SELECT *, 'mailto:'
+ EMail_tra AS EMail FROM Traveler
ORDER BY FirstName_tra,
LastName_tra </CFQUERY>
<hl>Travelers Grid</hl>
<CFFORM NAME="Forml"
ACTION-"CFGRID_5.cfm">
<CFGRID NAME="TravelerGrid" QUERY="GetTraveler"
WIDTH="500" HEIGHT="280" AUTOWIDTH="Yes"
SELECTMODE="Single"
COLHEADERALIGN="Center" FONT="Zurich Ex ВТ"
FONTSIZE="11" COLHEADERFONT="Zurich BlkEx ВТ"
ROWHEADERFONT="Zurich
Ex ВТ"
COLHEADERFONTSIZE="11" ROWHEADERFONTSIZE="8"
SELECTCOLOR="##808040" ROWHEIGHT="24"
BGCOLOR="#IEDECE0" TEXTCOLOR="#I696934" SORT="Yes"
PICTOREBAR="Yes"> <CFGRIDCOLUMN NAME="Key_tra" DISPIAY="No">
<CFGRIDCOLUMN
NAME="FirstName_tra" HEADER="First Name"
HREF="DetalTraveler.cfm" HREFKEY="Key_tra">
<CFGRIDCOLUMN NAME="LastName_tra" HEADER="Last Name">
<CFGRIDCOLUMN NAME="EMail" DISPLAY="No">
<CFGRIDCOLUMN NAME="EMail_tra"
HEADER="E-Mail"
WIDTH="110"
HREF="EMail"> <CFGRIDCOLUMN NAME="Gender_tra"
HEADER="M/W"
WIDTH="30"
TYPE="Boolean">
<CFGRIDCOLUMN NAME="Birthday_tra"
HEADER="Birthday" WIDTH="70"> </CFGRID> </CFFORM>
</BODY>
</HTML>
Правило передачи
значений выбранной записи при использовании гипертекстовых ссылок тега <CFGRIDCOLUMN>
аналогично правилу передачи значений тега <CFTREEITEM>. В этом же примере
мы использовали атрибут PICTUREBAR, предназначенный для вывода на кнопках вспомогательных
изображений, характеризующих возможные действия.
Предыдущая
глава была полностью посвящена модификации, добавлению и удалению данных. Так
вот, управляющий элемент <CFGRID> позволяет облегчить процесс формирования
интерфейса для решения подобных задач. Заданием значения атрибута SELECTMODE
тега <CFGRID> равным Edit предполагается возможность редактирования данных
непосредственно внутри построенной таблицы данных. Указав же при этом атрибуты
INSERT и DELETE, как показано в следующем примере, в нижней части управляющего
элемента появляются дополнительные кнопки, позволяющие выполнять соответствующие
действия (вставить и удалить). Впоследствии же остается только обработать произведенные
изменения в таблице и применить эти изменения к базе данных, являющейся источником
управляющего элемента <CFGRID>.
При редактировании
данных, используя управляющий элемент <CFGRID>, ColdFusion создает следующие
массивы:
Например,
для обработки выполненных изменений при передаче данных на страницу, указанную
атрибутом ACTION тега <CFFORM>, можно сформировать следующий код:
<CFIF isDefined("Form.TravelerGrid.
RowStatus.Action")>
<CFLOOP INDEX="Record"
FROM="1"
TO=#ArrayLen(Form.TravelerGrid.
RowStatus.Action)#>
<CFSWITCH EXPRESSION=#Form.
TravelerGrid.RowStatus.
Action[Record]#>
<CFCASE VALUE="U">
<!---Обновление
(UPDATE)--->
</CFCASE>
<CFCASE VALUE="I">
<!---Вставка
(INSERT)--->
</CFCASE>
<CFCASE VALUE="D">
<!---Удаление
(DELETE)--->
</CFCASE>
</CFSWITCH> </CFLOOP> </CFIF>
где TravelerGrid
— имя элемента <CFGRID>.
Следующий
пример состоит из двух частей или вернее из двух страниц: CFGRID_6.cfm (листинг
12.1), где расположена таблица, и RecordTravelers.cfm (листинг 12.2), где происходит
обработка и принятие исправлений. Далее происходит возвращение на страницу с
таблицей.
Листинг
12.1. Код страницы CFGRID_6.cfm
<HTML>
<HEAD>
<TITLE>CFGRID</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFQUERY NAME="GetTraveler"
DATASOURCE="#application.dsn#">
SELECT *
FROM Traveler
ORDER BY FirstName_tra,
LastName_tra
</CFQUERY>
<hl>Travelers
Grid</hl>
<CFFORM NAME="Forml"
ACTION="RecordTravelers.cfm">
<CFGRID NAME="TravelerGrid"
QUERY="GetTraveler"
WIDTH="500" HEIGHT="280"
AUTOWIDTH="Yes"
SELECTMODE="Edit"
COLHEADERALIGN="Center"
FONT="Zurich
Ex ВТ" FONTSIZE="11"
COLHEADERFONT="Zurich
BlkEx ВТ"
ROWHEADERFONT="Zurich
Ex ВТ"
COLHEADERFONTSIZE="11"
ROWHEADERFONTSIZE="8"
SELECTCOLOR="##808040"
ROWHEIGHT="24"
BGCOLOR="ltEDECEO"
TEXTCOLOR="ttt696934"
SORT="Yes" INSERT="Yes" DELETE--="Yes"
PICTUREBAR="Yes"> <CFGRIDCOLUMN NAME="Key_tra"
DISPLAY="No"> <CFGRIDCOLUMN NAME="Fir3tNome_tra"
HEADER="First Name"> <CFGRIDCOLUMN NAME="LastName_tra"
HEADER="Last Name"> <CFGRIDCOLUMN NAME="EMail_tra"
HEADER="E-Mail" WIDTH="110">
<CFGRIDCOLUMN NAME="Gender_tra"
HEADER="M/W"
WIDTH="30"
TYPE="Boolean"> <CFGRIDCOLUMN NAME="Birthday_tra"
HEADER="Birthday"
WIDTH="70"
BGCOLOR="(CX GT 1970-06-06 ? EDECE0 : Orange)">
</CFGRID>
<br><input type='Submit' value='Record'>
</CFFORM>
</BODY> </HTML>
Листинг
12.2. Код страницы RecordTravelers.cfm
<HTML>
<HEAD>
<TITLE>CFGRID</TITLE> </HEAD>
<BODY bgcolor="Silver">
<CFIF isDefined("Form.TravelerGrid.RowStatus.Action")>
<CCFLOOP INDEX="Record"
FROM="1"
TO=#ArrayLen(Form.TravelerGrid.RowStatus.Action)#>
<CFSWITCH EXPRESSION=fForm.
TravelerGrid.RowStatus.Action[Record]#>
<CFCASE VALUE="U">
<CFQUERY NAME="UpdateTraveler"
DATASOURCE="#application.dsn#">
UPDATE Traveler
SET FirstName_tra='#Form.TravelerGrid.
FirstName_tra[Record]#',
LastName_tra='#Form.TravelerGrid.
LastName_tra[Record]#',
EMail_tra='#Form.TravelerGrid.
EMail_tra[Record]#',
Gender_tra='#Form.TravelerGrid.
Gender_tra[Record]#',
Birthday_tra='#Form.TravelerGrid.
Birthday_tra[Record]#' WHERE
Key_tra=#Form.TravelerGrid.
Original.Key_tra[Record]#
</CFQUERY>
</CFCASE> <CFCASE VALUE="1">
<CFQUERY NAME="InsertTraveler"
DATASOURCE="lapplication.dsn#">
INSERT INTO Traveler(Firs.tName_tra,
LastName_tra,
EMail_tra,
Gender_tra, Birthday_tra,
Password_tra) VALUES
('#Form.TravelerGrid.FirstName_tra[Record]#',
'#Form.TravelerGrid.LastName_tra[Record]#',
'#Form.TravelerGrid.EMail_tra[Record]#',
'#Form.TravelerGrid.Gender_tra[Record]#',
'#Form.TravelerGrid.Birthday_tra[Record]#', '')
</CFQUERY>
</CFCASE> <CFCASE VALUE="D">
<CFQUERY NAME="DeleteTraveler"
DATASOURCE="#application.dsn#">
DELETE FROM
Traveler
WHERE Key_tra=|Form.TravelerGrid.
Original.Key_tra[Record]#
</CFQUERY>
</CFCASE>
</CFSWITCH>
</CFLOOP> </CFIF>
<META HTTP-EQUIV="Refresh"
CONTENT="0;URL=CFGRID_6.cfm">
</BODY>
</HTML>
На странице
CFGRID 6.cfm для поля с днями рождения был применен атрибут BGCOLOR со встроенным
выражением. Все дело в том, что для атрибутов TEXTCOLOR и BGCOLOR ColdFusion
дает возможность вместо конкретного значения использовать выражение, позволяющее
определять значение по условию. Причем формат выражения должен выглядеть следующим
образом: (СХ Operator String ? TrueCondition : FalseCondition) где:
BGCOLOR="(CX
GT 1970-06-06 ? EDECEO : Orange)"
Что позволяет
выделить цветом EDECEO сведения о тех, кто родился до 6 июня 1970 года, и закрасить
оранжевым цветом даты рождения всех остальных.
Тег <CFGRIDCOLUMN>
позволяет определять маску (mask) колонки, используя атрибут NUMBERFORMAT подобно
функции ColdFusion. NumberFormat. Применяется для числовых значений, например:
<CFGRIDCOLUMN
NAME="CostAdult_tou" HEADER="Adults" NUMBERFORMAT="$__.__">
Тег <CFGRID>,
так же, как теги <CFINPUT>, <CFTEXTINPUT>, <CFSLIDER> и <CFTREE>,
поддерживает атрибуты ONERROR и ONVALIDATE.
Тег <CFAPPLET>
предназначен для включения в код собственных Java-апплетов. Используемый Java-апплет
предварительно должен быть зарегистрирован на странице администратора "ColdFusion
Administrator" в разделе Server | Extensions | Java Applets (Сервер
| Расширения | Java-апплеты).
Здесь:
Также необходимые
параметры можно указывать с помощью тега <CFAPPLET> при непосредственном
использовании Java-апплета.
Приведенным
ниже примером мы завершаем описание построения форм на основе тега <CFFORM>,
где интегрируем в CFML-страницу Java-апплет copytext:
<HTML>
<HEAD>
<TITLE>CFAPPLET</TITLE>
</HEAD> <BODY bgcolor="Silver">
<CFFORM NAME="Forml"
ACTION="CFAPPLET_.cfm">
<CFAPPLET
APPLETSOURCE="Copytext" NAME="Copytext"
WIDTH="250" HEIGHT="70"> </CFFORM>
</BODY>
</HTML>
При использовании тега <CFAPPLET> обязательными атрибутами являются:
Отметим,
что все управляющие элементы тега формы <CFFORM>, основанные на Java-апплетах,
а это <CFTEXTINPUT>, <CFSLIDER>, <CFTREE>, <CFGRID>
и <CFAPPLET>, поддерживают атрибут NOTSUPPORTED, позволяющий указывать
текст сообщения, выводимого на экран, при отсутствии поддержки браузером Java-апплетов.
Подведем
итог. В данной главе мы использовали CFML-теги: <CFFORM>, <CFINPUT>,
<CFSELECT>, <CFTEXTINPUT>, <CFSLIDER>, <CFTREE>, <CFTREEITEM>,
<CFGRID>, <CFGRIDCOLUMN>, <CFGRIDROW>, <CFAPPLET>.